package com.qf.juc;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 什么叫公平锁：
 *   public static final Lock lock = new ReentrantLock(true);//公平锁
 *   等待时间最长的线程先获取到锁
 * 过期不候的锁：
 *   lock.tryLock(过期时间）
 *
 * 不见不散的锁：
 *   lock.lock();
 *
 *
 * @author lixu
 */
public class LockDemo {


    public static final Lock lock = new ReentrantLock();//Java1.5  //非公平锁

    /**
     *
     * 1、可重入锁  ReentrantLock  synchronized：老锁： 自动上锁 自动解锁
     */
    public void a(){
        //有一把锁
        lock.lock();
        System.out.println("我是a");
        //调用b方法
        b();
        lock.unlock();
    }
    public void b(){
        //有一把锁
        lock.lock();
        System.out.println("我是b");
        c();
        lock.unlock();
    }
    public void c(){
        //有一把锁
        lock.lock();
        System.out.println("我是c");
        lock.unlock();
    }

    public static void main(String[] args) {//主线程

        LockDemo lockDemo = new LockDemo();

        lockDemo.a();

        /**
         * 我是a
         * 我是b
         * 我是c
         *
         *  可重入：
         *
         *    volatile int state  :  为了让多线程之间可见性
         *        锁的底层原理：
         *           多个线程之间都能看到state值
         *
         *           当state=0时 ： 表示此锁没有上锁
         *           当state=1时 ： 表示此锁已经上锁了        破自行车上N多把锁
         *           当state=2时 ： 表示同一个线程上了二把锁
         *           当state=3时 ： 表示同一个线程上了三把锁
         *           .....
         *           当state=2时 ： 表示同一个线程解开了一把锁
         *           当state=1时 ： 表示同一个线程又解开了一把锁
         *
         *           当state=0时 ： 表示同一个线程解了所有的锁
         *
         */

    }

}
